#include "str.h"

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

struct str_s {
    char * data_;
    size_t len_;
    size_t alloc_size_;
};

static void dealloc_str(str_t * ptr){
    if(ptr){
        if(ptr->data_){
            free(ptr->data_);
        }
        free(ptr);
    }
}
static str_t * alloc_str(size_t alloc_size){
    str_t * ptr = (str_t*)malloc(sizeof(str_t));
    if(ptr == NULL) return NULL;

    ptr->data_ = (char *)malloc( (alloc_size) * sizeof(char));
    if(ptr->data_ == NULL){
        goto failed;
    }
    ptr->alloc_size_ = alloc_size;
    return ptr;
failed:
    dealloc_str(ptr);
    return NULL;
}

void str_destroy(str_t * ptr){
    dealloc_str(ptr);
}
str_t * str_create_from_cstr(const char * str){
    size_t len = strlen(str);
    str_t * ptr = alloc_str(len + 1);
    if(ptr == NULL) return NULL;

    memcpy(ptr->data_, str, len);
    ptr->len_ = len;
    ptr->data_[len] = '\0';
    return ptr;
}
str_t * str_create_from_array(char * array, size_t capacity, size_t len){
    str_t * ptr = alloc_str(capacity);
    if(ptr == NULL) return NULL;

    memcpy(ptr->data_, array, len);
    ptr->len_ = len;
    ptr->data_[len] = 0;
    return ptr;
}
str_t * str_create_as_zero_array(size_t capacity){
    str_t * ptr = alloc_str(capacity);
    if(ptr == NULL) return NULL;

    memset(ptr->data_, 0, capacity);
    ptr->len_ = 0;
    return ptr;
}
size_t str_length(const str_t * ptr){
    return ptr->len_;
}
int str_set_length(str_t * ptr, size_t len){
    if(len <= ptr->alloc_size_){
        ptr->len_ = len;
        return 0;
    }
    ptr->len_ = ptr->alloc_size_ - 1;
    return -1;
}
const size_t str_capacity(const str_t * ptr){
    return ptr->alloc_size_ - 1 ;
}
const char * str_const_data(const str_t * ptr){
    return (const char *)(ptr->data_);
}
char * str_data(str_t * ptr){
    return (char*)(ptr->data_);
}
int str_print(const str_t * ptr){
    return printf("%s", ptr->data_);
}
int str_println(const str_t * ptr){
    return printf("%s\n", ptr->data_);
}





//struct strview_s {
//    const char * str;
//    size_t len; 
//};
//typedef  struct strview_s strview_t;
//
//strview_t * strview_create(const char * str, size_t len){
//    strview_t * ptr = (strview_t*)malloc(sizeof(strview_t));
//    if(ptr == NULL) return NULL;
//    ptr->str = str;
//    ptr->len = len;
//    return ptr;
//}
//strview_t * strview_create_as_cstr(const char * str){
//    return strview_create(str, strlen(str));
//}
//strview_t * strview_create_as_carray(char [] arr){
//    return strview_create(arr, sizeof(arr));
//}

